# -*- coding: utf-8 -*-
import sys
import re

def clean_str(s):
    return unicode(s).replace('\r', '').strip()

def bulkreplace(s, rules):
    for old, new in rules:
        if isinstance(old, basestring):
            s = s.replace(old, new)
        else:
            s = old.sub(new, s)
    return s

def trunc_text(text, limit_chars, ending='...', by_spaces=False):
    """
    Truncate given text by symbols or words and add "..." or antother ending.
    """
    limit_chars -= len(ending)
    if len(text) > limit_chars:
        truncated = text[0:limit_chars]
        if not truncated:
            return text
        if by_spaces:
            truncated = truncated.rsplit(' ', 1)[0]
        return truncated + ending
    return text

SLUGIFY_TABLE = {
    u'а': 'a',
    u'б': 'b',
    u'в': 'v',
    u'г': 'g',
    u'д': 'd',
    u'е': 'e',
    u'ё': 'io',
    u'ж': 'j',
    u'з': 'z',
    u'и': 'i',
    u'й': 'yi',
    u'к': 'k',
    u'л': 'l',
    u'м': 'm',
    u'н': 'n',
    u'о': 'o',
    u'п': 'p',
    u'р': 'r',
    u'с': 's',
    u'т': 't',
    u'у': 'u',
    u'ф': 'f',
    u'х': 'h',
    u'ц': 'ts',
    u'ч': 'ch',
    u'ш': 'sh',
    u'щ': 'shch',
    u'ы': 'y',
    u'э': 'ye',
    u'ю': 'yu',
    u'я': 'ya',
    u'ă': 'a',
    u'î': 'i',
    u'ţ': 't',
    u'â': 'a',
    u'ş': 's',
    u' ': '-',
    u'_': '-',
    u'+': '-',
    u'-': '-',
}
SLUGIFY_TABLE.update(dict((x, x) for x in 'qwertyuiopasdfghjklzxcvbnm1234567890'))

replace_double_minus = re.compile('(-{2,})', re.UNICODE).sub
def slugify(s, max_length=50, exists=lambda value: False):
    result = ''.join(SLUGIFY_TABLE.get(sym, '') for sym in s.lower())
    result = replace_double_minus('-', result)[:max_length]

    for i in xrange(sys.maxint):
        if not exists(result):
            break
        result = '%s%d' % (result, i)

    return result
